/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.database.dao.impl;

import com.database.dao.UsuarioDao;
import com.database.model.Categoria;
import com.database.model.Usuario;
import com.database.util.HibernateUtil;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import com.database.util.MD5Util;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;


/**
 *
 * @author Diego y Yinna
 */
public class UsuarioDaoImplement implements UsuarioDao {

    private FacesContext context;

    @Override
    public Usuario buscarPorUsuario(Usuario usuario) {
        context = FacesContext.getCurrentInstance();
        Session session = HibernateUtil.getSessionFactory().openSession();
        String sql = "From Usuario u WHERE login=:username and password=:pass";
        Query query = session.createQuery(sql);
        query.setParameter("username", usuario.getLogin());
        try {
            usuario.setPassword(MD5Util.getMD5(usuario.getPassword()));
            query.setParameter("pass", usuario.getPassword());
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(UsuarioDaoImplement.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(UsuarioDaoImplement.class.getName()).log(Level.SEVERE, null, ex);
        }
        return (Usuario) query.uniqueResult();
    }

    @Override
    public void insertar(Usuario usuario) {
        context = FacesContext.getCurrentInstance();
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            usuario.setPassword(MD5Util.getMD5(usuario.getPassword()));
            usuario.setEstado(true);
             session.save(usuario);
             session.beginTransaction().commit(); 
            context.addMessage(null, new FacesMessage("Se ha guardado " + usuario.getNombres() + " con éxito!"));
        } catch (Exception e) {
            session.beginTransaction().rollback();
            context.addMessage(null, new FacesMessage("Hubo un problema al guardar \n" + e.getMessage()));
        }

    }

    @Override
    public void actualizar(Usuario usuario) {
        context = FacesContext.getCurrentInstance();
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            session.merge(usuario);
            session.beginTransaction().commit();
            context.addMessage(null, new FacesMessage("Se ha actualizado " + usuario.getNombres() + " con éxito!"));
        } catch (Exception e) {
            session.beginTransaction().rollback();
            context.addMessage(null, new FacesMessage("Hubo un problema al actualizar" + e.getMessage()));
        }
    }

    @Override
    public void eliminar(Usuario usuario) {//No se elimina, se Deshabilita el estado
        context = FacesContext.getCurrentInstance();
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            usuario.setEstado(false);
            session.merge(usuario);
            session.beginTransaction().commit();
            context.addMessage(null, new FacesMessage("Se ha DESHABILITADO " + usuario.getNombres() + " con éxito!"));
        } catch (Exception e) {
            session.beginTransaction().rollback();
            context.addMessage(null, new FacesMessage("Hubo un problema al eliminar" + e.getMessage()));
        }
    }

    @Override
    public Usuario buscarPorId(Integer id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        return (Usuario) session.load(Usuario.class, id);
    }

    @Override
    public List<Usuario> buscarTodos() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        return session.createQuery("From Usuario u order by u.apellidos asc").list();
    }

    @Override
    public List<Usuario> buscarTodosPorCategoria(Categoria categoria) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        return session.createQuery("From Usuario where perfil.codPerfil=3").list();
    }

    @Override
    public Usuario buscarIdentificacion(int identificacion){
        System.err.println("Identificacion entrante" + identificacion);
        Session session = HibernateUtil.getSessionFactory().openSession();
        String sql = "From Usuario u WHERE identificacion=:identificacion";
        Query query = session.createQuery(sql);
        query.setParameter("identificacion", identificacion);
        return (Usuario) query.uniqueResult();
    }
    
    
}